/**
 * F个物品，V个位置，Aij表示将物品i放到位置j的收益（可能为负）
 * 现在需要将F个物品全部放入，且位置先后顺序不能乱，问最大收益
 * 令Dij表示物品i放入位置j的最大收益，则
 * Dij = max{D[i-1][k], k=1,2,...,j-1}
 * 最后的答案是D[N][p], p为所有位置
 * 本题还要输出方案
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using pii = pair<int, int>;

llt const INF = 0x1F2F3F4F5F6F7F8F;
llt const NINF = -INF;

int F, V;
vector<vector<int>> A;
// vector<vector<vector<int>>> D;
vector<vector<llt>> D;
vector<vector<int>> G;

int chkmax(llt & a, llt b){
    if(b == NINF) return 0;
    if(a < b) return a = b, 1;
    return 0;
}

void output(int idx, int pos){
    if(1 == idx){
        cout << pos;
        return;
    }

    output(idx - 1, G[idx][pos]);
    cout << " " << pos;
    return;
}

void work(){
    cin >> F >> V;
    A.assign(F + 1, vector<int>(V + 1, 0));
    for(int i=1;i<=F;++i)for(int j=1;j<=V;++j) cin >> A[i][j];

    D.assign(F + 1, vector<llt>(V + 1, NINF));
    for(int i=1;i<=V;++i) D[1][i] = A[1][i];

    G.assign(F + 1, vector<int>(V + 1, 0));

    for(int i=2;i<=F;++i){
        for(int j=1;j<=V;++j){
            auto & d = D[i][j];
            int flag = 0;
            for(int k=1;k<j;++k){
                if(chkmax(d, D[i - 1][k])){
                    flag = k;
                } 
            }
            if(d != NINF){
                d += A[i][j];
                G[i][j] = flag;
            } 
        }
    }

    llt ans = NINF;
    int last = 0;
    for(int i=1;i<=V;++i){
        if(chkmax(ans, D[F][i])){
            last = i;
        }
    }
    cout << ans << "\n";
    output(F, last);
    cout << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase; 
    while(nofkase--) work();
    return 0;
}
